from django.views import View
from django import http
import logging
from django.core.cache import cache

from apps.areas.models import Area

# Create your views here.

# 创建记录生成器
logger = logging.getLogger('django')


class SubAreasView(View):
    """查询城市或者区县
    GET /areas/(?P<pk>[1-9]\d+)/
    """
    def get(self, request, parent_id):
        # 判断是否有缓存数据
        sub_data = cache.get('sub_data_%s' % parent_id)
        if sub_data:
            return http.JsonResponse({'code': 0, 'errmsg': 'ok', 'sub_data': sub_data})
        try:
            parent_area = Area.objects.get(id=parent_id)
            sub_model_list = parent_area.subs.all()

            # 将子集的查询集转化成字典列表
            subs = []
            for sub_model in sub_model_list:
                sub_dict = {
                    'id': sub_model.id,
                    'name': sub_model.name
                }
                subs.append(sub_dict)
            # 子集数据：城市或区县
            sub_data = {
                'id': parent_area.id,   # 父集id
                'name': parent_area.name,   # 父集名称
                'subs': subs  # 子集数据列表
            }
        except Exception as e:
            logger.error(e)
            return http.JsonResponse({'code': 400, 'errmsg': '城区或区县数据错误'})

        # 缓存子集的数据，城市或者区县
        # 说明：
        # 对于子级的缓存，我们需要区分当前缓存的是哪个父级的子级，
        # 比如：需要区分当前缓存的是河北省的城市还是山西省的城市，如果不做区分，数据就会被覆盖
        cache.set('sub_data_%s' % parent_id, sub_data, 3600)

        return http.JsonResponse({'code': 0, 'errmsg': 'ok',
                                  'sub_data': sub_data})


class ProvinceAreasView(View):
    """省份查询
    GET /areas/
    """
    def get(self, request):
        # 判断缓存中是否存在已缓存的数据
        province_list = cache.get('province_list')
        if province_list:
            return http.JsonResponse({'code': 0, 'errmsg': 'ok',
                                      'province_list': province_list})
        # if not province_list:

        # 获取省份的查询集
        province_model_list = Area.objects.filter(parent=None)

        # 将查询集转化成字典列表
        province_list = []
        for province_model in province_model_list:
            # 把模型数据转换成字典
            province_dict = {
                'id': province_model.id,
                'name': province_model.name
            }
            province_list.append(province_dict)

        # 缓存提取的省份数据
        # cache.set('key', 'value', '过期时间，单位秒')
        cache.set('province_list', province_list, 3600)

        # 重要提示：JsonResponse()不识别模型数据(模型对象和查询集)，只识别列表，字典，列表字典
        return http.JsonResponse({'code': 0, 'errmsg': 'ok',
                                  'province_list': province_list})
